package main

import (
	"fmt"
	"math/rand"
	"sync"
	"sync/atomic"
	"time"
)

type Config struct { //定义一个配置信息的结构体
	dbtype string
	ip     string
	time   string
}

func loadNewConfig() Config {
	return Config{
		dbtype: "mysql",
		ip:     "127.0.0.1",
		time:   time.Now().Format("2006-01-02 15:04:05"),
	}
}
func main() {
	var config atomic.Value
	config.Store(loadNewConfig())
	var cond = sync.NewCond(&sync.Mutex{})
	go func() { // 启动一个 goroutine 用来变更配置信息
		for {
			time.Sleep(time.Duration(5+rand.Int63n(5)) * time.Second) //休眠随机时长
			config.Store(loadNewConfig())                             // 更新配置
			cond.Broadcast()                                          // 通知等待着配置已变更
		}
	}()
	go func() { // 启动一个 goroutine 加载最新的配置信息
		for {
			cond.L.Lock()
			cond.Wait()                 // 等待变更信号
			c := config.Load().(Config) // 读取新的配置
			fmt.Printf("最新配置: %+v\n", c)
			cond.L.Unlock()
		}
	}()
	select {}
}
